private Runnable getTask() {
		// 取出任务时间超时标识
    boolean timedOut = false; // Did the last poll() time out?

    for (;;) {
        int c = ctl.get();
        int rs = runStateOf(c);
	
        // 线程池状态为shutdown，阻塞队列中没有任务，返回Null
				// 线程池状态为stop，放弃阻塞队列中的任务，返回null
        if (rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) {
						// 返回null之前，将工作线程数量-1
            decrementWorkerCount();
            return null;
        }
				// 当前线程池中的工作线程
        int wc = workerCountOf(c);

        // Are workers subject to culling?
       /*
					allowCoreThreadTimeOut默认为false 
					（问：allowCoreThreadTimeOut为true，核心线程是否与非核心线程一样了，这里按照两者相同理解）
					timed为ture:
					1.允许核心线程过期
					2.当前线程池中的线程数超过核心线程数，即当前线程肯定为非核心线程
       */
        
        boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;
				/*
					wc > maximumPoolSize 当前线程数量大于线程池设置的最大线程数，一般为false，只看(timed && timedOut)。
					timed为true，即当前线程为非核心线程。
				  timedOut默认为false，第一次循环timedOut肯定为false，所以第一次循环不会进入if分支。
					只有在非核心线程获取任务超时，timeout为true。
					所以要进入分支，必须是非核心线程获取任务超时，且当前线程池中的线程数>1或阻塞队列中没有任务时才进入。
				*/
        if (
					  (wc > maximumPoolSize || (timed && timedOut)) && 
            (wc > 1 || workQueue.isEmpty())
           ) {
            // cas对线程数量-1
            if (compareAndDecrementWorkerCount(c))
								// cas成功返回null
                return null;
            // cas失败（修改失败，线程中断了），继续for循环
            continue;
        }

        try {
            Runnable r = timed ?
								// timed为true，非核心线程等待一会 
                workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) :
                // timed为false，核心线程死等
                workQueue.take();
            // 获取到了任务将任务返回    
            if (r != null)
                return r;
            // 没有获取到任务，超时，进入下一次for循环
            timedOut = true;
        } catch (InterruptedException retry) {
            timedOut = false;
        }
    }
}